(function ($, window) {

    //1.获取js 和 css
    $.fn.filePowerWebUpload = function (options) {
        var ele = this;
        $("<link>").attr({ rel: "stylesheet", type: "text/css", href: "product/webuploader/webuploader.css" }).appendTo("head");
        $.getScript("product/webuploader/webuploader.min.js").done(function() {
            initWebUpload(ele, options);
        }).fail(function() {
            alert("请检查webuploader的路径是否正确!")
        });
    }
    /*
    *    2.Web Uploader的所有代码都在一个内部闭包中，对外暴露了唯一的一个变量WebUploader
    *      Web Uploader内部类的详细说明，以下提及的功能类，都可以在WebUploader这个变量中访问到
    * */
    function initWebUpload(item, options) {

        if (!WebUploader.Uploader.support()) {
            if (window.console) {
                window.console.log("上传控件不支持您的浏览器！请尝试升级flash版本或者使用Chrome引擎的浏览器。<a target='_blank' href='http://se.360.cn'>下载页面</a>");
            }
            $(item).text(error);
            return;
        }
        //创建默认参数
        var defaults = {
            auto:true,                                 //默认自动上传
            onAllComplete: function (event) { },        // 当所有file都上传后执行的回调函数
            onComplete: function (event) { },           // 每上传一个file的回调函数
            innerOptions: {},                           //用于拓展的一个变量
            fileNumLimit: undefined,                    //验证文件总数量, 超出则不允许加入队列
            fileSizeLimit: undefined,                   //验证文件总大小是否超出限制, 超出则不允许加入队列。
            fileSingleSizeLimit: undefined,             //验证单个文件大小是否超出限制, 超出则不允许加入队列
            PostbackHold: false

        };
        var opts = $.extend(defaults, options);
        var target = $(item);//容器
        var pickerid = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);//唯一的ID

        //拼接DIV了并追加到了容器元素上
        var uploaderStrdiv = ''
        if (opts.auto) {
            uploaderStrdiv =
                '<div  class="uploader-list"></div>' +
                '<div class="btns">' +
                '<div id="' + pickerid + '">选择文件</div>' +
                '</div>'

        } else {
            uploaderStrdiv =
                '<div  class="uploader-list"></div>' +
                '<div class="btns">' +
                '<div id="' + pickerid + '">选择文件</div>' +
                '<button class="webuploadbtn">开始上传</button>' +
                '</div>'
        }
        uploaderStrdiv += '<div style="display:none" class="UploadhiddenInput" ></div>'
        target.append(uploaderStrdiv);

        var $list = target.find('.uploader-list'),
            $btn = target.find('.webuploadbtn'),//手动上传按钮备用
            state = 'pending';
        var jsonData = {
            fileList: []
        };
        var webuploaderoptions = $.extend({
                // swf文件路径
                swf:  'product/webuploader/Uploader.swf',
                // 文件接收服务端。
                server:  'upload.html',
                // 选择文件的按钮。可选。
                // 内部根据当前运行是创建，可能是input元素，也可能是flash.
                pick: {id:'#' + pickerid,innerHTML:"选择文件",multiple:true},
                formData: {
                    type1:opts.type,
                },
                //不压缩image, 默认如果是jpeg，文件上传前会压缩一把再上传！
                resize: false,
                fileNumLimit: opts.fileNumLimit,
                fileSizeLimit: opts.fileSizeLimit,
                fileSingleSizeLimit: opts.fileSingleSizeLimit
            },
            opts.innerOptions);
        // var uploader = WebUploader.create(webuploaderoptions);
        var uploader = new WebUploader.Uploader(webuploaderoptions);

        if (opts.auto) {
            //当文件加入队列的时候出发
            uploader.on('fileQueued', function (file) {
                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
                                '<span class="webuploadinfo" style="float:left">' + file.name + '</span>' +
                                '<span class="webuploadstate" style="float:left;margin-left:10px;">正在上传...</span>' +
                                '<div class="webuploadDelbtn" style="float:left;margin-left:10px;"><a href="javascript:;">删除</a></div><br />' +
                            '</div>');
                uploader.upload();
            });
        } else {
            uploader.on('fileQueued', function (file) {//队列事件
                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
                                '<span class="webuploadinfo" style="float:left">' + file.name + '</span>' +
                                '<span class="webuploadstate" style="float:left;margin-left:10px;">等待上传...</span>' +
                                '<div class="webuploadDelbtn" style="float:left;margin-left:10px;"><a href="javascript:;">删除</a></div><br />' +
                            '</div>');
            });
        }
        //当文件上传过程中触发：文件，上传进度数据
        uploader.on( 'uploadProgress', function( file, percentage ) {
            var $li = $('#' + $(item)[0].id + file.id),
                $percent = $li.find('.progress .progress-bar');
            // 避免重复创建
            if ( !$percent.length ) {
                $percent = $('<div class="progress progress-striped active">' +
                            '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                            '</div>' +
                            '</div>').appendTo( $li ).find('.progress-bar');
            }
            $li.find('span.webuploadstate').html('上传中');
            $percent.css( 'width', percentage * 100 + '%' );
        });
        //当文件上传成功时触发：文件，服务端返回的数据
        uploader.on('uploadSuccess', function (file, response) {
            if (response.result == "0") {
                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html(response.message);

                setTimeout(function(){
                    target.find('#' + $(item)[0].id + file.id).html('');
                },4000);
            } else {
                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('已上传');
                $('#' + $(item)[0].id + file.id).append("<input name='"+options.fileName+"' type='hidden' value='"+ response.message + "'>");
            }
        });

        uploader.on('uploadError', function (file) {
            target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('上传出错');
        });
        //全部完成事件
        uploader.on('uploadComplete', function (file) {
            target.find('#' + $(item)[0].id + file.id).find('.progress').fadeOut();

        });
        //调用每个事件都会触发：更改state状态为了更改手动上传按钮上的文字及按钮所触发的事件
        uploader.on('all', function (type) {
            if (type === 'startUpload') {
                state = 'uploading';
            } else if (type === 'stopUpload') {
                state = 'paused';
            } else if (type === 'uploadFinished') {
                state = 'done';
            }
            if (state === 'uploading') {
                $btn.text('暂停上传');
            } else {
                $btn.text('开始上传');
            }

        });
        //手动上传初始化事件
        $btn.on('click', function () {
            if (state === 'uploading') {
                uploader.stop();
            } else {
                uploader.upload();
            }
        });

        //删除按钮添加将文件移除队列事件
        $list.on("click", ".webuploadDelbtn", function () {
            var $ele = $(this);
            var id = $ele.parent().attr("id");
            var id = id.replace($(item)[0].id, "");
            var file = uploader.getFile(id);
            uploader.removeFile(file);
        });
        //当文件被移除队列后触发
        uploader.on('fileDequeued', function (file) {
            $("#"+ $(item)[0].id + file.id).remove();
        })
        //当validate不通过时，会以派送错误事件的形式通知调用者
        uploader.onError = function( code ) {
            var text="";
            if(code!=null && code!=''){
                if(code=='Q_EXCEED_NUM_LIMIT'){
                    text="最多只能上传"+options.fileNumLimit+"个附件";
                }else if(code=='Q_EXCEED_SIZE_LIMIT'){
                    text="文件大小超出限制";
                }else if(code=='Q_TYPE_DENIED'){
                    text="上传文件类型不符";
                } else if(code=='F_DUPLICATE'){
                    text="列表中已经存在";
                } else {
                    text="未知错误";
                }
                alert( '错误：' + text );
            }else{
                code=null ;
                text="" ;
            }
        };
    }

})(jQuery, window);